home *** CD-ROM | disk | FTP | other *** search
/ A.C.E. 2 / ACE CD 2.iso / FILES / UTILS / PROCAL13.DMS / PROCAL13.adf / Rexx / swap.rexx < prev    next >
OS/2 REXX Batch file  |  1991-12-11  |  5KB  |  145 lines

  1. /* Swap                       S. Dicker                 6-Aug-89    */
  2. /*                                                                  */
  3. /*    ARexx program used to swap two columns of cells on an         */
  4. /*  Advantage spreadsheet. The two columns at the left and right    */
  5. /*  sides of the currently selected range are exchanged (without    */
  6. /*  making any adjustments to the cell contents.)                   */
  7.  
  8. signal on error                 /* Trap host command errors. */
  9.  
  10. address 'Advantage'             /* Send commands to Advantage. */
  11.  
  12. options results                 /* Enable return of string results. */
  13.  
  14. 'Current'                       /* Determine current selected range. */
  15. range = result
  16.  
  17. colon_posn = pos(":",range)     /* Look for colon delimiter in range. */
  18.  
  19. if colon_posn = 0 then          /* If no colon, this is not a range. */
  20.    do                           /*  Warn the user and then bail out. */
  21.       do i = 1 to 100
  22.          'DrawMessage'       
  23.             "Select a range BEFORE using Swap"
  24.       end i
  25.       exit 10
  26.    end
  27. else                            /* OK - found a colon. Let's do the swap. */
  28.    do
  29.       /* Save the co-ordinates of the cells at the upper-left and */
  30.       /* lower-right corners of the selected range.               */
  31.       upper = left(range,colon_posn - 1)
  32.       lower = substr(range,colon_posn + 1)
  33.  
  34.       /* Extract the labels of the columns to be swapped. */
  35.       source1_column = GetColumn(upper)
  36.       source2_column = GetColumn(lower)
  37.  
  38.       /* Extract the range of rows to be swapped. */
  39.       start_row = GetRow(upper)
  40.       end_row   = GetRow(lower)
  41.  
  42.       /* Run through all rows, swapping the cell contents */
  43.       do rownum = start_row to end_row
  44.          call SwapCells(source1_column||rownum,source2_column||rownum)
  45.       end rownum
  46.       
  47.       /* Reselect the original range of cells. */
  48.       'SelectRange'
  49.          value(upper)
  50.          value(lower)
  51.    end                  /* End if (range of cells to swap selected) */
  52.  
  53. exit                    /* That's all folks! */
  54.  
  55. /* >>> Host command error handler <<< */
  56. Error:
  57.    exit rc                 /* Just bail out and return error code. */
  58.  
  59.  
  60. /* ----------------------------------------------------------------- */
  61. /*            Internal Functions (subroutines)                       */
  62. /* ----------------------------------------------------------------- */
  63.  
  64. /* == GetRow: Extract the row number from a cell name. == */
  65.  
  66. GetRow: procedure
  67.    arg CellName      /* Function expects to be passed a cell name. */
  68.  
  69.    /* Find the first numeric digit in the cell name. */
  70.    start_number = verify(CellName,"0123456789","Match")
  71.    
  72.    /* Extract all characters starting at the first digit and continuing */
  73.    /* to the end of the cell name.                                      */
  74.    rownum = substr(CellName,start_number)
  75.  
  76. return rownum
  77.  
  78. /* == GetColumn: Extract the column label from a cell name. == */
  79.  
  80. GetColumn: procedure
  81.    arg CellName      /* Function expects to be passed a cell name. */
  82.  
  83.    /* Find the first numeric digit in the cell name. */
  84.    start_number = verify(CellName,"0123456789","Match")
  85.    
  86.    /* Extract all characters in the cell name up to the first numeric */
  87.    /* character (start of row number).                                */
  88.    column = left(CellName,start_number-1)
  89.  
  90. return column
  91.  
  92. /* == GetCell: Extract the contents of a specified cell. == */
  93.  
  94. GetCell: procedure
  95.    arg CellName      /* Function expects to be passed a cell name. */
  96.  
  97.    'SelectCell'      /* Select the cell whose contents we want. */
  98.       value(CellName)
  99.       
  100.    'IsValue'         /* Does this cell contain a "value". */
  101.    val_flag = result
  102.    
  103.    'IsFormula'       /* Does this cell contain a "formula". */
  104.    form_flag = result
  105.  
  106.    /* Now extract the cell contents based on what type of data it  */
  107.    /* contains. NOTE: Order is important here! Formula cells will  */
  108.    /* return both 'IsValue' = 1 and 'IsFormula' = 1 so that if you */
  109.    /* want to treat formula cells as formulas (and not as their    */
  110.    /* computed values) check if it's a formula before checking if  */
  111.    /* it's a value.                                                */
  112.    select
  113.       when form_flag = 1 then           /* A Formula ...   */
  114.          'GetFormula'
  115.       when val_flag = 1 then            /* ... a Value ... */
  116.          'GetValue'
  117.       otherwise                         /* ... or a Label. */
  118.          'GetLabel'
  119.    end
  120.  
  121. return result      /* Return the cell contents. */
  122.  
  123. /* == SwapCells: Exchange the contents of two cells. */
  124.  
  125. SwapCells: procedure
  126.    arg cell_1,cell_2    /* Function expects two cell names. */
  127.    
  128.    contents_1 = GetCell(cell_1)         /* Extract contents of cell 1. */
  129.    
  130.    contents_2 = GetCell(cell_2)         /* Extract contents of cell 2. */
  131.    
  132.    'SelectCell'                         /* Select cell 1 ... */
  133.       value(cell_1)
  134.  
  135.    'PutCell'                            /*  and copy contents of */
  136.       contents_2                        /*  cell 2 into it.      */
  137.       
  138.    'SelectCell'                         /* Select cell 2 ... */
  139.       value(cell_2)
  140.  
  141.    'PutCell'                            /*  and copy contents of */
  142.       contents_1                        /*  cell 1 into it.      */
  143.  
  144. return
  145.